home *** CD-ROM | disk | FTP | other *** search
-
- *GOSUB MACRO (CALL PROC OR FUNC)
- *AFFECTS: STACK, AC, POSSIBLY AR1 AND/OR AR0
- *
- * GOSUB ROUTINE,(TO-LIST),(FROM-LIST)
- *
- * ROUTINE := NAME OF FUNC OR PROC BEING CALLED
- * T0-LIST := TO-ARG|TO-ARG,TO-LIST
- * FROM-LIST := FROM-ARG|FROM-ARG,FROM-LIST
- *
- * TO-ARG := VARIABLE|(VARIABLE,LENGTH)|
- * CONST|(CONST)|((CONST,CONST,...,CONST))
- * FROM-ARG := VARIABLE|(VARIABLE,LENGTH)
- *
- * TO-LIST := A GROUP OF VARIABLES COPIED TO ROUTINE
- * FORMAL LOCATIONS BEFORE CALL
- * FROM-LIST := A GROUP OF VARIABLES COPIED FROM FORMAL
- * LOCATION AFTER THE RETURN
- * LENGTH := NUMBER OF WORDS (IF OMITTED, DEFUALT IS ONE)
- * CONST := CONSTANTS
-
- $GOSB6 $MACRO B1,B2,B3,B4,B5,B6,B7,B8
- $IF B1.L#=0
- $GOSB3 :B1:
- $ENDIF
- $IF B2.L#=0
- $GOSB3 :B2:
- $ENDIF
- $IF B3.L#=0
- $GOSB3 :B3:
- $ENDIF
- $IF B4.L#=0
- $GOSB3 :B4:
- $ENDIF
- $IF B5.L#=0
- $GOSB3 :B5:
- $ENDIF
- $IF B6.L#=0
- $GOSB3 :B6:
- $ENDIF
- $IF B7.L#=0
- $GOSB3 :B7:
- $ENDIF
- $IF B8.L#=0
- $GOSB6 :B8:
- $ENDIF
- $END GOSB6
-
- $GOSB7 $MACRO B1,B2,B3,B4,B5,B6,B7,B8
- $IF B1.L#=0
- $GOSB5 :B1:
- $ENDIF
- $IF B2.L#=0
- $GOSB5 :B2:
- $ENDIF
- $IF B3.L#=0
- $GOSB5 :B3:
- $ENDIF
- $IF B4.L#=0
- $GOSB5 :B4:
- $ENDIF
- $IF B5.L#=0
- $GOSB5 :B5:
- $ENDIF
- $IF B6.L#=0
- $GOSB5 :B6:
- $ENDIF
- $IF B7.L#=0
- $GOSB5 :B7:
- $ENDIF
- $IF B8.L#=0
- $GOSB7 :B8:
- $ENDIF
- $END GOSB7
-
- GOSUB $MACRO A,B,C
- $CHECK :A:
- $VAR L
- $ASG '$$CNTR' TO L.S
- $ASG 0 TO L.SV INIT ARG COUNT
- $ASG :A: TO L.SS SAVE CALL NAME
- $IF B.L#=0
- $GOSB6 :B:
- $ENDIF
- $IF A.SA&$UNDF
- REF :A: DEFINE AS EXTERN
- $ENDIF
- CALL :A: CALL SUBR
- $ASG 0 TO L.SV INIT ARG COUNT
- $IF C.L#=0
- $GOSB7 :C:
- $ENDIF
- $END
-
- *MACROS CALLED FROM GOSUB
-
- $GOSB3 $MACRO A,B
- $VAR L,P
- $ASG '$$CNTR' TO L.S GET COUNTR
- $ASG :L.SS::L.SV: TO P.S MAKE FORMAL NAME
- $IF P.SA&$UNDF
- REF :P: DEFINE :P: AS EXTERN
- $ENDIF
- $IF A.SA&$UNDF A IS A CONST
- $IF B.L=0 ONLY ONE CONST
- $VAR M,Q
- $ASG '$$LAB' TO M.S
- V$:M.SV: EQU :A: COMPENSATE FOR NEG NUM
- $ASG 'V$' TO Q.S
- $ASG :Q.S::M.SV: TO A.S
- $ASG M.SV+1 TO M.SV
- $IF (A.SV<256)&(A.SV>-1)
- LACK :A: ACC := 8 BIT CONST
- $ELSE
- REF LDAC$ ACC := 16 BIT CONST
- CALL LDAC$
- DATA :A:
- $ENDIF
- SACL :P: SAVE IN :P:
- $ELSE MORE THAN ONE CONST
- $IF B.A&$POPL MORE THAN TWO CONST
- $ASG B.V+1 TO L.V
- $ELSE
- $ASG 2 TO L.V L.V = # OF CONST
- $ENDIF
- REF MOVC$
- CALL MOVC$ CALL CONST MOVER
- DATA :P: TO :P:
- DATA :L.V: FOR :L.V: WORDS
- DATA :A:,:B: THE DATA
- $ENDIF
- $ELSE A IS A VARIABLE
- $IF B.V<2 SINGLE SYMBOL
- LAC :A:,0 LOAD :A:
- SACL :P:,0 SAVE FOR SUBR IN :P:
- $ELSE
- REF MOVAB$
- CALL MOVAB$ CALL MOVER
- DATA :A: FROM :A:
- DATA :P: TO :P:
- DATA :B.V: FOR :B.V: WORDS
- $ENDIF
- $ENDIF
- $ASG L.SV+1 TO L.SV TO NEXT ARG
- $END
-
- $GOSB5 $MACRO A,B
- $VAR L,P
- $ASG '$$CNTR' TO L.S TO COUNTR
- $IF A.L#=0 NON-BLANK
- $ASG :L.SS::L.SV: TO P.S MAKE FORMAL NAME
- $IF P.SA&$UNDF
- REF :P: DEFINE :P: AS EXTERN
- $ENDIF
- $IF B.V<2 SINGLE WORD
- LAC :P:,0 LOAD :P: FROM SUBR
- SACL :A:,0 SAVE IN :A:
- $ELSE MORE THAN ONE WORD
- REF MOVAB$
- CALL MOVAB$ CALL MOVER
- DATA :P: FROM :P:
- DATA :A: TO :A:
- DATA :B.V: FOR :B.V: WORDS
- $ENDIF
- $ASG L.SV+1 TO L.SV NEXT ARG
- $END